from rest_framework_simplejwt.authentication import JWTAuthentication
from user_app.utils.redis_utils import RedisClient

redis_client = RedisClient()
'''
在每次请求到来时自动检查其携带的 JWT access token；
通过 jti 查询 Redis 判断该 token 是否仍有效；
如果无效，直接返回 401 错误，避免请求到达业务逻辑层。
这是双 Token 架构中非常关键的一环，确保了即使 token 被窃取，也可以通过 Redis 快速撤销访问权限。
'''
class RedisJWTMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        auth = JWTAuthentication()
        header = auth.get_header(request)
        if header:
            raw_token = auth.get_raw_token(header)#从请求头中提取出原始的 token 字符串（去掉 Bearer 前缀）。
            validated_token = auth.get_validated_token(raw_token)#对 token 进行签名验证，并将其解析为 Python 字典格式（包含 payload 内容）。
            jti = validated_token.get('jti')#从解析后的 token 中取出 jti（JWT ID），它是 token 的唯一标识符。
            if jti and not redis_client.is_access_token_valid(jti):
                from rest_framework.response import Response
                return Response({'detail': 'Token 已失效'}, status=401)
        return self.get_response(request)
    
'''
1. 登录成功后：
   - 返回 access_token（短期有效）
   - 设置 refresh_token（长期有效）到 HttpOnly Cookie

2. 每次请求 API：
   - 前端自动带上 Cookie（含 refresh_token）
   - 同时前端手动在 header Authorization 字段放入 access_token
     👇
3. 后端中间件读取 header 中的 access_token
   - 解析出 jti
   - 查询 Redis 是否存在该 jti ✅
   - 如果不存在 → 拒绝访问（token 已失效）

4. 当 access_token 过期：
   - 前端检测到 401 错误
   - 发起刷新 token 请求
   - 后端读取 Cookie 中的 refresh_token
   - 验证是否合法 → 合法则返回新的 access_token

'''